import requests

from plotly.graph_objs import Bar
from plotly import offline

#执行API调用并存储响应
url='https://api.github.com/search/repositories?q=language:python&sort=stars'
headers={'Accept':'application/vnd.github.v4+json'}#指定API版本，当前版本为v4
r=requests.get(url,headers=headers)#请求调用API,并将一个响应对象赋给变量r,即相当于把API的个人信息赋值给变量r
print(f"Status code :{r.status_code}")#查看请求是否成功

#处理结果
response_dict=r.json()#使用json()方法,将API返回的json格式信息转化为Python字典
repo_dicts=response_dict['items']#与item关联的值是一个字典列表
                                #列表中的每一个字典都包含一个有关Python仓库的信息,将这个列表存储在repo_dicts中
repo_links,stars,labels=[],[],[]
for repo_dict in repo_dicts:
    repo_name=repo_dict['name']#获取使用者名称
    repo_url=repo_dict['html_url']#获取仓库url
    repo_link=f"<a href='{repo_url}'>{repo_name}</a>"#将用户姓名和网址超链接放一起,中间为HTML代码的超链接表示
    repo_links.append(repo_link)#添加每一个Pythonc仓库的用户姓名
    stars.append(repo_dict['stargazers_count'])#添加每一个Python仓库的星级

    owner=repo_dict['owner']['login']#获取所有者的登录名
    description=repo_dict['description']#获取所有者项目描述
    label=f'{owner}<br />{description}'#中间为HTML代码的换行符
    labels.append(label)#添加每一个仓库的所有者登录名和项目描述

#可视化
data=[{
    'type':'bar',#绘制条形图
    'x':repo_links,#提供x值
    'y':stars,#提供y值
    'hovertext':labels,#提取列表文本,并在鼠标指向条形时显示
    'marker':{
    'color':'rgb(60,100,150)',#指定条形为蓝色
    'line':{'width':1.5,'color':'rgb(25,25,25)'}#设置宽1.5像素的深灰色轮廓,设置条形的不透明度为0.6
    }#进行条形设置
}]#设置表的类型参数和数值参数
my_layout={
    'title':'GitHub上最受欢迎的Python项目',#指定图表名称
    'titlefont':{'size':28},#指定图表名称字号
    'xaxis':{
             'title':'Repository',#指定x轴名称
             'titlefont':{'size':24},#指定x轴标签字号
             'tickfont':{'size':14}#指定刻度标签字号
             },
    'yaxis':{
             'title':'Stars',#指定y轴名称
             'titlefont':{'size':24},#指定y轴标签字号
             'tickfont':{'size':14}#指定刻度标签字号
             },
}#指定图表布局和配置对象,此处也可以通过创建Layout实例来设定布局
fig={'data':data,'layout':my_layout}#创造图表对象,同时包含数值要求和布局要求
offline.plot(fig,filename='python_repos.html')#生成图表,并指定图表保存位置
